package de.unibi.techfak.msp.eatThis.service;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import de.unibi.techfak.msp.eatThis.bean.GenericBean;
import flexjson.JSONDeserializer;
import flexjson.JSONSerializer;

/**
 * Servlet implementation class DefaultService.
 */
@WebServlet(description = "DefaultService which does nothing",
            urlPatterns = { "/DefaultService" })
public class DefaultService extends HttpServlet {
    
    protected static final long serialVersionUID = 201L;
    
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DefaultService() {
        super();
    }

    //CHECKSTYLE:OFF Wir überschreiben diese methode!
    @Override
    //CHECKSTYLE:ON
    protected void doGet(final HttpServletRequest request, 
                         final HttpServletResponse response) 
    throws ServletException, IOException {
        response.getWriter().println(
                "Hurra! Der EatThis Android Endpunkt ist verfügbar!");
    }
    
    /**
     * @param parameters belibiege Strings
     * @return True falls alle Strings ungleich NULL
     */
    protected final boolean checkNull(final String... parameters) {
        for (String parameter : parameters) {
            if (parameter == null) {
                return false;
            }
        }
        return true;
    }

    /**
     * Erstellt eine JSON representation des übergebenen Objekts.
     * @param bean Das zu serialisierende Objekt
     * @return Den fertigen JSON String oder NULL bei fehlern.
     * @see #jettionise(GenericBean)
     */
    protected final String jettionise(final GenericBean bean) {
        return new JSONSerializer().serialize(bean);
    }
    
    /**
     * Erstellt eine JSON representation des übergebenen Objekts.
     * @param beanList Das zu serialisierende Objekt
     * @return Den fertigen JSON String oder NULL bei fehlern.
     * @see #jettionise(GenericBean)
     */
    protected final String jettionise(
        final List<? extends GenericBean> beanList) {
        return new JSONSerializer().serialize(beanList);
    }
    
    /**
     * @param jsonRepBean JSON representation einer Bean
     * @param bean Die Zielklasse zu serialisierende Objekt
     * @return Das deserialisierte Objekt
     */
    protected final GenericBean deJettionise(final String jsonRepBean,
            final Class<? extends GenericBean> bean) {
        return (GenericBean) 
            new JSONDeserializer<GenericBean>().deserialize(jsonRepBean, bean);
    }
    
    /**
     * @param jsonRepBean JSON representation einer Bean
     * @param beanList Die Zielklasse zu serialisierende Objekt
     * @return Das deserialisierte Objekt
     */
    protected final GenericBean deJettionise(final String jsonRepBean,
            final List<? extends GenericBean> beanList) {
        return (GenericBean) 
            new JSONDeserializer<Object>().deserialize(jsonRepBean,
                    beanList.getClass());
    }
    
    /**
     * Liefert einen String aus dem  StringInputStream eines 
     * {@link HttpServletRequest} Objekts. Achtung: Der Stream wird 
     * geschlossen!
     *  
     * @param request rewuest das einen InputStream enthält (JSON String)
     * @return Den ausgelesenen String!
     * @throws IOException Falls nicht gelesen werden konnte.
     */
    protected final String readJsonInputFromStream(
            final HttpServletRequest request) throws IOException {
        BufferedReader inStream = new BufferedReader(
                new InputStreamReader(request.getInputStream()));
        
        StringBuilder jsonInput = new StringBuilder();
        String line;
        while ((line = inStream.readLine()) != null) {
            jsonInput.append(line);
        }
        inStream.close();
        return jsonInput.toString();
    }
    

}
